/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package es.us.mwm.entities;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

/**
 * Clase para la gestión de la tabla Alerts de la base de datos. Entity CLASE GENERADA AUTOMATICAMENTE. MODIFICADA
 *
 * @author y0rg
 */
@Entity
@Table(name = "ALERTS")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Alerts.findAll", query = "SELECT a FROM Alerts a"),
    @NamedQuery(name = "Alerts.findById", query = "SELECT a FROM Alerts a WHERE a.id = :id"),
    @NamedQuery(name = "Alerts.findByType", query = "SELECT a FROM Alerts a WHERE a.type = :type"),
    @NamedQuery(name = "Alerts.findByLatitude", query = "SELECT a FROM Alerts a WHERE a.latitude = :latitude"),
    @NamedQuery(name = "Alerts.findByLongitude", query = "SELECT a FROM Alerts a WHERE a.longitude = :longitude"),
    @NamedQuery(name = "Alerts.findByDescription", query = "SELECT a FROM Alerts a WHERE a.description = :description"),
    @NamedQuery(name = "Alerts.findByPhone", query = "SELECT a FROM Alerts a WHERE a.phone = :phone"),
    @NamedQuery(name = "Alerts.findByName", query = "SELECT a FROM Alerts a WHERE a.name = :name"),
    @NamedQuery(name = "Alerts.findByDate", query = "SELECT a FROM Alerts a WHERE a.date = :date")})
public class Alerts implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 20)
    @Column(name = "TYPE")
    private String type;
    @Basic(optional = false)
    @NotNull
    @Column(name = "LATITUDE")
    private double latitude;
    @Basic(optional = false)
    @NotNull
    @Column(name = "LONGITUDE")
    private double longitude;
    @Size(max = 250)
    @Column(name = "DESCRIPTION")
    private String description;
    @Basic(optional = false)
    @NotNull
    @Column(name = "PHONE")
    private int phone;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 25)
    @Column(name = "NAME")
    private String name;
    @Basic(optional = false)
    @NotNull
    @Column(name = "DATE")
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;
    @JoinColumn(name = "USE", referencedColumnName = "USE")
    @ManyToOne(optional = true)
    private Users user;

    //Atibutos no pertencientes a la tabla y que nos sirven para mostrar la localizacion de las alertas en el mapa
    @Transient
    private MapModel simpleModel;
    @Transient
    private LatLng coord;

    /**
     * Constructor sin parametros. Inicializacion del MapModel
     */
    public Alerts() {
        simpleModel = new DefaultMapModel();
    }

    /**
     * Constructor de clase a partir de un identificador
     *
     * @param id identificador
     */
    public Alerts(Long id) {
        this.id = id;

    }

    /**
     * Constructor con todos los parametros
     *
     * @param id identificador
     * @param type tipo
     * @param latitude latitud
     * @param longitude longitud
     * @param phone telefono
     * @param name nombre
     * @param date fecha
     */
    public Alerts(Long id, String type, double latitude, double longitude, int phone, String name, Date date) {
        this.id = id;
        this.type = type;
        this.latitude = latitude;
        this.longitude = longitude;
        this.phone = phone;
        this.name = name;
        this.date = date;
        //AQUI NO ENTRA
        simpleModel = new DefaultMapModel();
        coord = new LatLng(this.latitude, this.longitude);
        simpleModel.addOverlay(new Marker(coord, this.type));
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return Mapa con el marcador localizado
     */
    public MapModel getSimpleModel() {
        coord = new LatLng(this.latitude, this.longitude);
        simpleModel.addOverlay(new Marker(coord, this.type));
        return simpleModel;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param simpleModel Mapa con los marcadores
     */
    public void setSimpleModel(MapModel simpleModel) {
        this.simpleModel = simpleModel;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return identificador
     */
    public Long getId() {
        return id;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param id identificador
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return tipo alerta: policia, bomberos, medica, proteccion civil
     */
    public String getType() {
        return type;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param type tipo alerta: policia, bomberos, medica, proteccion civil
     */
    public void setType(String type) {
        this.type = type;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return latitud
     */
    public double getLatitude() {
        return latitude;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param latitude latitud
     */
    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return longitud
     */
    public double getLongitude() {
        return longitude;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param longitude longitud
     */
    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return descripcion
     */
    public String getDescription() {
        return description;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param description descripcion
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return telefono
     */
    public int getPhone() {
        return phone;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param phone telefono
     */
    public void setPhone(int phone) {
        this.phone = phone;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return nombre persona que da la alerta
     */
    public String getName() {
        return name;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param name nombre persona que da la alerta
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return fecha y hora
     */
    public Date getDate() {
        return date;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param date fecha y hora
     */
    public void setDate(Date date) {
        this.date = date;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @return usuario que tramita la alerta
     */
    public Users getUser() {
        return user;
    }

    /**
     * Metodo de acceso a atributo
     *
     * @param user usuario que tramita la alerta
     */
    public void setUser(Users user) {
        this.user = user;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Alerts)) {
            return false;
        }
        Alerts other = (Alerts) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Alerts{" + "id=" + id + ", type=" + type + ", latitude=" + latitude + ", longitude=" + longitude
                + ", description=" + description + ", phone=" + phone + ", name=" + name + ", date=" + date + ", use=" + user + '}';
    }

}
